#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
    // 系统参数结构体
typedef struct {
    uint32_t param1;
    float param2;
    // ...其他参数
} SystemParams;

// 存储地址定义（根据实际芯片修改）
#define NV_STORAGE_ADDR  0x0800F000  // 示例Flash地址
#define RAM_BUFFER_ADDR  &ram_params // RAM缓存地址

SystemParams persistent_params; // 持久化存储的参数
SystemParams ram_params;        // RAM中的临时参数
bool use_ram_params = false;    // 标志位

// 初始化时从非易失性存储加载
void params_init() {
    // 从Flash/EEPROM读取
    memcpy(&persistent_params, (void*)NV_STORAGE_ADDR, sizeof(SystemParams));
    
    // 验证数据有效性（可选）
    if(persistent_params.param1 == 0xFFFFFFFF) {
        // 初始化默认值
        persistent_params.param1 = 100;
        persistent_params.param2 = 3.14f;
    }
    
    // 初始化RAM缓存
    memcpy(&ram_params, &persistent_params, sizeof(SystemParams));
}

// 获取参数值（统一接口）
uint32_t get_param1() {
    return use_ram_params ? ram_params.param1 : persistent_params.param1;
}

// 设置临时参数
void set_temp_param1(uint32_t value) {
    use_ram_params = true;
    ram_params.param1 = value;
}

// 提交保存到非易失性存储
void save_params() {
    // 擦除Flash页（以STM32为例）
    FLASH_EraseInitTypeDef erase;
    erase.TypeErase = FLASH_TYPEERASE_PAGES;
    erase.PageAddress = NV_STORAGE_ADDR;
    erase.NbPages = 1;
    
    uint32_t error;
    HAL_FLASH_Unlock();
    HAL_FLASHEx_Erase(&erase, &error);
    
    // 写入新数据
    uint64_t* src = (uint64_t*)&persistent_params;
    for(int i=0; i<sizeof(SystemParams)/8; i++) {
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, 
                         NV_STORAGE_ADDR+i*8, src[i]);
    }
    HAL_FLASH_Lock();
    
    // 更新RAM缓存
    memcpy(&ram_params, &persistent_params, sizeof(SystemParams));
    use_ram_params = false;
}

// 放弃临时修改
void discard_temp_params() {
    use_ram_params = false;
    // 下次读取会自动使用持久化参数
}
}
